home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / library / chmod.c < prev    next >
C/C++ Source or Header  |  1995-09-27  |  3KB  |  110 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  chmod.c,v 1.1.1.1 1994/04/04 04:30:15 amiga Exp
  20.  *
  21.  *  chmod.c,v
  22.  * Revision 1.1.1.1  1994/04/04  04:30:15  amiga
  23.  * Initial CVS check in.
  24.  *
  25.  *  Revision 1.3  1993/11/05  21:52:05  mw
  26.  *  grp/oth support
  27.  *
  28.  *  Revision 1.2  1992/05/18  12:19:34  mwild
  29.  *  now completely ignore FIBF_DELETE, correctly set errno in case of failure
  30.  *
  31.  * Revision 1.1  1992/05/14  19:55:40  mwild
  32.  * Initial revision
  33.  *
  34.  */
  35.  
  36. #define KERNEL
  37. #include "ixemul.h"
  38. #include "kprintf.h"
  39.  
  40. #if __GNUC__ != 2
  41. #define alloca __builtin_alloca
  42. #endif
  43.  
  44. /* not static because also used in nodspecial.c */
  45. int
  46. __chmod_func (struct StandardPacket *sp, struct MsgPort *handler,
  47.               BPTR parent_lock,
  48.           BSTR name,
  49.           int mask, int *no_error)
  50. {
  51.   sp->sp_Pkt.dp_Type = ACTION_SET_PROTECT;
  52.   sp->sp_Pkt.dp_Arg1 = 0;
  53.   sp->sp_Pkt.dp_Arg2 = parent_lock;
  54.   sp->sp_Pkt.dp_Arg3 = name;
  55.   sp->sp_Pkt.dp_Arg4 = mask;
  56.   
  57.   PutPacket (handler, sp);
  58.   __wait_sync_packet (sp);
  59.   
  60.   *no_error = sp->sp_Pkt.dp_Res1 == -1;
  61.   return 1;
  62. }
  63.  
  64.  
  65. int
  66. chmod(char *name, int mode)
  67. {
  68.   long amiga_mode = FIBF_READ|FIBF_WRITE|FIBF_DELETE|FIBF_EXECUTE;
  69.   /* RWED-permissions are "lo-active", if cleared they allow the operation */
  70.   int result;
  71.  
  72.   if (mode & S_IXUSR) amiga_mode &= ~FIBF_EXECUTE;
  73.   if (mode & S_IWUSR) amiga_mode &= ~(FIBF_WRITE|FIBF_DELETE);
  74.   if (mode & S_IRUSR) amiga_mode &= ~FIBF_READ;
  75. #ifdef FIBF_GRP_EXECUTE
  76.   if (mode & S_IXGRP) amiga_mode |= FIBF_GRP_EXECUTE;
  77.   if (mode & S_IWGRP) amiga_mode |= FIBF_GRP_WRITE|FIBF_GRP_DELETE;
  78.   if (mode & S_IRGRP) amiga_mode |= FIBF_GRP_READ;
  79.   if (mode & S_IXOTH) amiga_mode |= FIBF_OTR_EXECUTE;
  80.   if (mode & S_IWOTH) amiga_mode |= FIBF_OTR_WRITE|FIBF_OTR_DELETE;
  81.   if (mode & S_IROTH) amiga_mode |= FIBF_OTR_READ;
  82. #endif
  83.  
  84.   result = __plock (name, __chmod_func, amiga_mode);
  85.   if (result == 0)
  86.     {
  87.       errno = __ioerr_to_errno (IoErr ());
  88.       KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  89.     }
  90.  
  91.   return result == -1 ? 0 : -1;
  92. }
  93.  
  94.  
  95. /* a signal proof SetProtection(), nothing more ;-) */
  96. int
  97. achmod (char *name, int mode)
  98. {
  99.   int result;
  100.  
  101.   result = __plock (name, __chmod_func, mode) == -1 ? 0 : -1;
  102.   if (result == 0)
  103.     {
  104.       errno = __ioerr_to_errno (IoErr ());
  105.       KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  106.     }
  107.  
  108.   return result;
  109. }
  110.